package com.demo.rabbitmq;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * Hello world!
 */
public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();

        //设置主机地址
        connectionFactory.setHost("localhost");

        //设置连接端口号，默认：5672
        connectionFactory.setPort(5672);

        //设置虚拟主机名称，默认: /
        connectionFactory.setVirtualHost("/");

        //设置连接用户名
        connectionFactory.setUsername("guest");

        //设置连接密码
        connectionFactory.setPassword("guest");

        //创建连接
        Connection connection = connectionFactory.newConnection();

        //创建频道
        Channel channel = connection.createChannel();

        //接收消息
        DefaultConsumer consumer = new DefaultConsumer(channel){

            //回调方法，当收到消息后，会自动执行该方法
            //参数1：consumerTag： 标识
            //参数2：envelope：获取一些信息，交换机，路由key...
            //参数3：properties 配置信息
            //参数4：body 数据
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumerTag：" + consumerTag);
                System.out.println("envelope：" + envelope.getExchange());
                System.out.println("RoutingKey：" + envelope.getRoutingKey());
                System.out.println("properties：" + properties);
                System.out.println("body：" + new String(body));
            }
        };

        //参数1：queue: 队列名称
        //参数2：autoAck：是否自动确认，类似咱们发短信，发送成功会收到一个确认消息
        //参数3：callback：回调对象
        //消费者类似一个监听程序，主要是用来监听消息
        channel.basicConsume("simple_queue", true, consumer);
    }
}
